/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Items;

import ElementsProperties.Dropable;
import Actors.Actor;
import Model.Case;
import ElementsProperties.Explodable;
import java.awt.image.BufferedImage;
import java.util.Vector;

/**
 *
 * @author vf
 */
public abstract class Bomb extends Item implements Dropable{

    private long currentBurningTime;
    private int currentBurningImg;
    private long timeByImg;
    boolean isBurning=false;
    
    public BufferedImage[] itemAnimation;
    public long totalBurningTime;
    public int animImgs;
    public int explosionRadius;

    public abstract void setProperties();

    public Bomb(){
        super();
        currentBurningTime = 0;
        currentBurningImg = 0;
        setProperties();
    }

    public BufferedImage[] createAnimImgs(String filename){
         BufferedImage[] itemAnim = new BufferedImage[animImgs];
         BufferedImage imgTemp = EnigmaUtils.ImageLoader.loadImage(filename);
         for (int i=0;i<animImgs;i++){
             itemAnim[i] = imgTemp.getSubimage(0, i*32, 32, 32);
         }
         return itemAnim;
    }

    @Override
    public void update(long dtime) {
        if (isBurning){
            //System.out.println("BURNING. currentBurningTime: "+(currentBurningTime+=dtime));
            currentBurningTime+=dtime;
            if (currentBurningTime>=currentBurningImg*timeByImg){
                currentBurningImg++;
            }
            if (currentBurningImg<animImgs+1){
                itemImage=itemAnimation[currentBurningImg-1];//currentBurningImg initialisé à 0 puis passe à 1 avec le IF precedent
                this.changed();
            }
            else
                explode();
        }
    }

    public void explode(){
        isBurning = false;
        startExplosion(explosionRadius);
        myCase.removeItem();
        setCase(null);
    }

    public void ignite(){//Appelé lors d'une explosion sur la case
        isBurning=true;
        timeByImg=totalBurningTime/animImgs;
    }

    private void startExplosion(int explosionRadius){
        for (int i=-explosionRadius;i<=explosionRadius;i++){
            for (int j=-(explosionRadius-Math.abs(i));j<=explosionRadius-Math.abs(i);j++){

                Case target=myCase.getCase(myCase.getXIndex()+i,myCase.getYIndex()+j);
                if(target!=null){
                    Vector<Object> targetComponentList=target.getComponentList();
                    for(Object o : targetComponentList)
                        if(o instanceof Explodable){
                            Explodable o2= (Explodable) o;
                            o2.explode();
                        }

                    if(target.getItem() instanceof Bomb){
                        Bomb bomb = (Bomb) target.getItem();
                        bomb.ignite();
                    }
                }
            }
        }
     }
    

    public void droped(){
        // myCase=null si l'objet n'a pas pu être déposé
        // c'est moche mais bon, j'ai pas le courage de
        // retoucher le modèle pour gérer ca proprement
        if(myCase!=null) ignite();
    }
}